library(waffle)
Error in library(waffle) : there is no package called ‘waffle’
df <- readr::read_csv("~/Github/product_journey/data/my_product_journey.csv") %>%
  dplyr::mutate(temp = 0)
Rows: 16 Columns: 8
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (6): organization, product, description, type, client, link
dbl (2): id, year

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df
# Custom colours
drsimonj_colors <- c(
  `lite green` = "#9FC2B9",
  `mid green` = "#1E6E6E",
  `dark green` = "#153331",
  `orange` = "#E74F2C",
  `red` = "#A62014")


drsimonj_cols <- function(...) {
  cols <- c(...)

  if (is.null(cols))
    return (drsimonj_colors)

  drsimonj_colors[cols]
}


drsimonj_palettes <- list(
  `main`  = drsimonj_cols("lite green", "mid green", "dark green", "orange", "red"))


drsimonj_pal <- function(palette = "main", reverse = FALSE, ...) {
  pal <- drsimonj_palettes[[palette]]

  if (reverse) pal <- rev(pal)

  colorRampPalette(pal, ...)
}


scale_color_drsimonj <- function(palette = "main", discrete = TRUE, reverse = FALSE, ...) {
  pal <- drsimonj_pal(palette = palette, reverse = reverse)

  if (discrete) {
    discrete_scale("colour", paste0("drsimonj_", palette), palette = pal, ...)
  } else {
    scale_color_gradientn(colours = pal(256), ...)
  }
}


scale_fill_drsimonj <- function(palette = "main", discrete = TRUE, reverse = FALSE, ...) {
  pal <- drsimonj_pal(palette = palette, reverse = reverse)

  if (discrete) {
    discrete_scale("fill", paste0("drsimonj_", palette), palette = pal, ...)
  } else {
    scale_fill_gradientn(colours = pal(256), ...)
  }
}
df %>%
  ggplot() +
  aes(x = year) +
  geom_histogram(bins = 30L, fill = "#153331") +
  theme_minimal() +
  scale_y_continuous(breaks = scales::pretty_breaks())

df %>%
  ggplot() +
  aes(x = year, y = temp, shape = group) +
  geom_point(position = position_jitter(w = 1, h = 0.01), size = 3) +
  scale_color_hue(direction = 1) +
  theme_minimal() +
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        axis.title.y = element_blank()) +
  labs(x = "Product Release Year") +
  scale_x_continuous(breaks = scales::pretty_breaks())



df %>%
  ggplot() +
  aes(x = year, y = temp, colour = group) +
  geom_point(position = position_jitter(w = 1, h = 0.01), size = 3) +
  scale_color_drsimonj() +
  theme_minimal() +
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        axis.title.y = element_blank()) +
  labs(x = "Product Release Year") +
  scale_x_continuous(breaks = scales::pretty_breaks())



df %>%
  ggplot() +
  aes(x = year, fill = group) +
  geom_histogram(bins = 30L) +
  scale_fill_drsimonj() +
  theme_minimal() +
  labs(x = "Product Release Year",
       y = "Number of Products") +
  theme(legend.position = "bottom",
        legend.title=element_blank())

df %>%
  ggplot() +
  aes(x = year, y = temp, colour = group, label = organization, label2 = product, label3 = description, label4 = link) +
  geom_point(position = position_jitter(w = 1, h = 0.01), size = 3) +
  coord_fixed(ratio = 160) +
  scale_color_drsimonj() +
  theme_minimal() +
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        axis.title.y = element_blank()) +
  labs(x = "Product Release Year") +
  scale_x_continuous(breaks = scales::pretty_breaks())

p1 <- df %>%
  ggplot() +
  aes(x = year, y = temp, colour = type, label = organization, label2 = product, label3 = description) +
  geom_point(position = position_jitter(w = 1, h = 0.01), size = 3) +
  scale_color_drsimonj() +
  theme_minimal() +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank()) +
  labs(x = "Product Release Year") +
  scale_x_continuous(breaks = scales::pretty_breaks())

plotly::ggplotly(p1,
                 width = 1000,
                 heigh = 300,
                 tooltip = c("year", "organization", "product", "description"))
p2 <- df %>%
  ggplot() +
  aes(x = year, y = temp, label = organization, label2 = product, label3 = type) +
  geom_point(position = position_jitter(w = 1, h = 0.01), size = 3, colour = "#153331") +
  scale_color_drsimonj() +
  theme_minimal() +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank()) +
  labs(x = "Product Release Year") +
  scale_x_continuous(breaks = scales::pretty_breaks())

plotly::ggplotly(p2,
                 width = 1000,
                 heigh = 300,
                 tooltip = c("year", "organization", "product", "type"))
# Vector
x <- c(G1 = 30, G2 = 25, G3 = 20, G4 = 5)

# Waffle chart
waffle(x, rows = 8)

df %>%
  dplyr::group_by(type) %>%
  dplyr::tally() %>%
  dplyr::ungroup()

# Vector
a <- c(Application = 5, `Digital Twin` = 3, Extension = 4, `Mobile App` = 1, SaaS = 3)

# Waffle chart
waffle(a, rows = 4)

df %>%
  ggplot(aes(x, y, fill = type)) + 
  geom_waffle()
Error in FUN(X[[i]], ...) : object 'x' not found

df %>%
  dplyr::group_by(type) %>%
  dplyr::tally() %>%
  dplyr::ungroup() %>%
  ggplot2::ggplot() +
   aes(x = 2, y = n, fill = type) +
   geom_bar(stat = "identity") +
   coord_polar("y", start = 200) +
   theme_void() +
   theme(legend.position = "bottom",
         legend.title = element_blank()) +
   scale_fill_drsimonj() +
   xlim(0.7, 2.5)

ggplot(data = rdown.os, 
       aes(x = 2, y = percentage, fill = os))+
  geom_bar(stat = "identity")+
  coord_polar("y", start = 200) +
  geom_text(aes(y = lab.pos, label = paste(percentage,"%", sep = "")), col = "white") +
  theme_void() +
  scale_fill_drsimonj() +
  xlim(.2,2.5)
Error in ggplot(data = rdown.os, aes(x = 2, y = percentage, fill = os)) : 
  object 'rdown.os' not found
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkocmVhZHIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KGdnd2FmZmxlKQpsaWJyYXJ5KHdhZmZsZSkKYGBgCgpgYGB7cn0KZGYgPC0gcmVhZHI6OnJlYWRfY3N2KCJ+L0dpdGh1Yi9wcm9kdWN0X2pvdXJuZXkvZGF0YS9teV9wcm9kdWN0X2pvdXJuZXkuY3N2IikgJT4lCiAgZHBseXI6Om11dGF0ZSh0ZW1wID0gMCkKZGYKYGBgCgoKYGBge3J9CiMgQ3VzdG9tIGNvbG91cnMKZHJzaW1vbmpfY29sb3JzIDwtIGMoCiAgYGxpdGUgZ3JlZW5gID0gIiM5RkMyQjkiLAogIGBtaWQgZ3JlZW5gID0gIiMxRTZFNkUiLAogIGBkYXJrIGdyZWVuYCA9ICIjMTUzMzMxIiwKICBgb3JhbmdlYCA9ICIjRTc0RjJDIiwKICBgcmVkYCA9ICIjQTYyMDE0IikKCgpkcnNpbW9ual9jb2xzIDwtIGZ1bmN0aW9uKC4uLikgewogIGNvbHMgPC0gYyguLi4pCgogIGlmIChpcy5udWxsKGNvbHMpKQogICAgcmV0dXJuIChkcnNpbW9ual9jb2xvcnMpCgogIGRyc2ltb25qX2NvbG9yc1tjb2xzXQp9CgoKZHJzaW1vbmpfcGFsZXR0ZXMgPC0gbGlzdCgKICBgbWFpbmAgID0gZHJzaW1vbmpfY29scygibGl0ZSBncmVlbiIsICJtaWQgZ3JlZW4iLCAiZGFyayBncmVlbiIsICJvcmFuZ2UiLCAicmVkIikpCgoKZHJzaW1vbmpfcGFsIDwtIGZ1bmN0aW9uKHBhbGV0dGUgPSAibWFpbiIsIHJldmVyc2UgPSBGQUxTRSwgLi4uKSB7CiAgcGFsIDwtIGRyc2ltb25qX3BhbGV0dGVzW1twYWxldHRlXV0KCiAgaWYgKHJldmVyc2UpIHBhbCA8LSByZXYocGFsKQoKICBjb2xvclJhbXBQYWxldHRlKHBhbCwgLi4uKQp9CgoKc2NhbGVfY29sb3JfZHJzaW1vbmogPC0gZnVuY3Rpb24ocGFsZXR0ZSA9ICJtYWluIiwgZGlzY3JldGUgPSBUUlVFLCByZXZlcnNlID0gRkFMU0UsIC4uLikgewogIHBhbCA8LSBkcnNpbW9ual9wYWwocGFsZXR0ZSA9IHBhbGV0dGUsIHJldmVyc2UgPSByZXZlcnNlKQoKICBpZiAoZGlzY3JldGUpIHsKICAgIGRpc2NyZXRlX3NjYWxlKCJjb2xvdXIiLCBwYXN0ZTAoImRyc2ltb25qXyIsIHBhbGV0dGUpLCBwYWxldHRlID0gcGFsLCAuLi4pCiAgfSBlbHNlIHsKICAgIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvdXJzID0gcGFsKDI1NiksIC4uLikKICB9Cn0KCgpzY2FsZV9maWxsX2Ryc2ltb25qIDwtIGZ1bmN0aW9uKHBhbGV0dGUgPSAibWFpbiIsIGRpc2NyZXRlID0gVFJVRSwgcmV2ZXJzZSA9IEZBTFNFLCAuLi4pIHsKICBwYWwgPC0gZHJzaW1vbmpfcGFsKHBhbGV0dGUgPSBwYWxldHRlLCByZXZlcnNlID0gcmV2ZXJzZSkKCiAgaWYgKGRpc2NyZXRlKSB7CiAgICBkaXNjcmV0ZV9zY2FsZSgiZmlsbCIsIHBhc3RlMCgiZHJzaW1vbmpfIiwgcGFsZXR0ZSksIHBhbGV0dGUgPSBwYWwsIC4uLikKICB9IGVsc2UgewogICAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IHBhbCgyNTYpLCAuLi4pCiAgfQp9CmBgYAoKCmBgYHtyfQpkZiAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB5ZWFyKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDMwTCwgZmlsbCA9ICIjMTUzMzMxIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNjYWxlczo6cHJldHR5X2JyZWFrcygpKQpgYGAKCmBgYHtyfQpkZiAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB5ZWFyLCB5ID0gdGVtcCwgc2hhcGUgPSBncm91cCkgKwogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIodyA9IDEsIGggPSAwLjAxKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9jb2xvcl9odWUoZGlyZWN0aW9uID0gMSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGxhYnMoeCA9ICJQcm9kdWN0IFJlbGVhc2UgWWVhciIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKCkpCgoKZGYgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0geWVhciwgeSA9IHRlbXAsIGNvbG91ciA9IGdyb3VwKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3ID0gMSwgaCA9IDAuMDEpLCBzaXplID0gMykgKwogIHNjYWxlX2NvbG9yX2Ryc2ltb25qKCkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGxhYnMoeCA9ICJQcm9kdWN0IFJlbGVhc2UgWWVhciIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKCkpCgoKZGYgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0geWVhciwgZmlsbCA9IGdyb3VwKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDMwTCkgKwogIHNjYWxlX2ZpbGxfZHJzaW1vbmooKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHggPSAiUHJvZHVjdCBSZWxlYXNlIFllYXIiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgUHJvZHVjdHMiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgbGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkKYGBgCgoKYGBge3J9CmRmICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IHllYXIsIHkgPSB0ZW1wLCBjb2xvdXIgPSBncm91cCwgbGFiZWwgPSBvcmdhbml6YXRpb24sIGxhYmVsMiA9IHByb2R1Y3QsIGxhYmVsMyA9IGRlc2NyaXB0aW9uLCBsYWJlbDQgPSBsaW5rKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3ID0gMSwgaCA9IDAuMDEpLCBzaXplID0gMykgKwogIGNvb3JkX2ZpeGVkKHJhdGlvID0gMTYwKSArCiAgc2NhbGVfY29sb3JfZHJzaW1vbmooKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgbGFicyh4ID0gIlByb2R1Y3QgUmVsZWFzZSBZZWFyIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzY2FsZXM6OnByZXR0eV9icmVha3MoKSkKYGBgCgoKCmBgYHtyfQpwMSA8LSBkZiAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSB5ZWFyLCB5ID0gdGVtcCwgY29sb3VyID0gdHlwZSwgbGFiZWwgPSBvcmdhbml6YXRpb24sIGxhYmVsMiA9IHByb2R1Y3QsIGxhYmVsMyA9IGRlc2NyaXB0aW9uKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3ID0gMSwgaCA9IDAuMDEpLCBzaXplID0gMykgKwogIHNjYWxlX2NvbG9yX2Ryc2ltb25qKCkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGxhYnMoeCA9ICJQcm9kdWN0IFJlbGVhc2UgWWVhciIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKCkpCgpwbG90bHk6OmdncGxvdGx5KHAxLAogICAgICAgICAgICAgICAgIHdpZHRoID0gMTAwMCwKICAgICAgICAgICAgICAgICBoZWlnaCA9IDMwMCwKICAgICAgICAgICAgICAgICB0b29sdGlwID0gYygieWVhciIsICJvcmdhbml6YXRpb24iLCAicHJvZHVjdCIsICJkZXNjcmlwdGlvbiIpKQpgYGAKCgpgYGB7cn0KcDIgPC0gZGYgJT4lCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0geWVhciwgeSA9IHRlbXAsIGxhYmVsID0gb3JnYW5pemF0aW9uLCBsYWJlbDIgPSBwcm9kdWN0LCBsYWJlbDMgPSB0eXBlKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3ID0gMSwgaCA9IDAuMDEpLCBzaXplID0gMywgY29sb3VyID0gIiMxNTMzMzEiKSArCiAgc2NhbGVfY29sb3JfZHJzaW1vbmooKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgbGFicyh4ID0gIlByb2R1Y3QgUmVsZWFzZSBZZWFyIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzY2FsZXM6OnByZXR0eV9icmVha3MoKSkKCnBsb3RseTo6Z2dwbG90bHkocDIsCiAgICAgICAgICAgICAgICAgd2lkdGggPSAxMDAwLAogICAgICAgICAgICAgICAgIGhlaWdoID0gMzAwLAogICAgICAgICAgICAgICAgIHRvb2x0aXAgPSBjKCJ5ZWFyIiwgIm9yZ2FuaXphdGlvbiIsICJwcm9kdWN0IiwgInR5cGUiKSkKYGBgCgoKYGBge3J9CiMgVmVjdG9yCnggPC0gYyhHMSA9IDMwLCBHMiA9IDI1LCBHMyA9IDIwLCBHNCA9IDUpCgojIFdhZmZsZSBjaGFydAp3YWZmbGUoeCwgcm93cyA9IDgpCmBgYAoKCgoKCmBgYHtyfQpkZiAlPiUKICBkcGx5cjo6Z3JvdXBfYnkodHlwZSkgJT4lCiAgZHBseXI6OnRhbGx5KCkgJT4lCiAgZHBseXI6OnVuZ3JvdXAoKQoKIyBWZWN0b3IKYSA8LSBjKEFwcGxpY2F0aW9uID0gNSwgYERpZ2l0YWwgVHdpbmAgPSAzLCBFeHRlbnNpb24gPSA0LCBgTW9iaWxlIEFwcGAgPSAxLCBTYWFTID0gMykKCiMgV2FmZmxlIGNoYXJ0CndhZmZsZShhLCByb3dzID0gNCkKYGBgCgoKYGBge3J9CmdncGxvdChkZiwgYWVzKGZpbGwgPSBncm91cCwgdmFsdWVzID0gdmFsdWUpKSArCiAgZ2VvbV93YWZmbGUobl9yb3dzID0gOCwgc2l6ZSA9IDAuMzMsIGNvbG91ciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIjQkExODJBIiwgIiNGRjgyODgiLCAiI0ZGREJERCIpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkEiLCAiQiIsICJDIikpICsKICBjb29yZF9lcXVhbCgpICsKICB0aGVtZV92b2lkKCkKYGBgCgoKYGBge3J9CmRmICU+JQogIGRwbHlyOjpncm91cF9ieSh0eXBlKSAlPiUKICBkcGx5cjo6dGFsbHkoKSAlPiUKICBkcGx5cjo6dW5ncm91cCgpICU+JQogIGdncGxvdDI6OmdncGxvdCgpICsKICAgYWVzKHggPSAyLCB5ID0gbiwgZmlsbCA9IHR5cGUpICsKICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICAgY29vcmRfcG9sYXIoInkiLCBzdGFydCA9IDIwMCkgKwogICB0aGVtZV92b2lkKCkgKwogICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArCiAgIHNjYWxlX2ZpbGxfZHJzaW1vbmooKSArCiAgIHhsaW0oMC43LCAyLjUpCmBgYAoKYGBge3J9CmdncGxvdChkYXRhID0gcmRvd24ub3MsIAogICAgICAgYWVzKHggPSAyLCB5ID0gcGVyY2VudGFnZSwgZmlsbCA9IG9zKSkrCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpKwogIGNvb3JkX3BvbGFyKCJ5Iiwgc3RhcnQgPSAyMDApICsKICBnZW9tX3RleHQoYWVzKHkgPSBsYWIucG9zLCBsYWJlbCA9IHBhc3RlKHBlcmNlbnRhZ2UsIiUiLCBzZXAgPSAiIikpLCBjb2wgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgeGxpbSguMiwyLjUpCmBgYAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==